package com.spark.mooc.ch6_sparksql.part04_fromRDDtoDataFrame

import org.apache.spark.sql.{DataFrame, SparkSession}

/**
 * @description: 利用反射机制推断RDD模式
 *              事先知道字段
 * @time: 2020/11/29 9:56
 * @author: lhy
 */
// 只有case类 spark才能将RDD隐式转换成DataFrame
case class Person(name:String, age:Long)

object ReflectionInferenceRDD {
    def main(args: Array[String]): Unit = {
        val spark: SparkSession = SparkSession.builder().appName("ReflectionInferenceRDD").master("local").getOrCreate()
        import spark.implicits._        // 导入包，支持把一个RDD隐式转换成一个DataFrame
        val peopleDF: DataFrame = spark.sparkContext.textFile("data.txt/people.txt")
                                                    .map(_.split(","))
                                                    .map(attributes => Person(attributes(0),attributes(1).trim.toInt))
                                                    .toDF()
        peopleDF.createOrReplaceTempView("people")      // 必须注册成临时表才能供下面的查询使用
        val personsRDD: DataFrame = spark.sql("select name,age from people where age > 20")    // 最终生成一个DataFrame
        // 从DataFrame中的每一个元素都是一行记录，包含name和age两个字段，分别用t(0)和t(1)来获取值
        personsRDD.map(t => "Name:"+t(0)+","+"Age:"+t(1)).show()
    }
}
